package com.ffggffgfv.backend.mapper;

import com.ffggffgfv.backend.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户数据访问层
 */
@Mapper
public interface UserMapper {

    /**
     * 查询所有用户
     *
     * @return 用户列表
     */
    List<User> selectAll();

    /**
     * 根据ID查询用户
     *
     * @param id 用户ID
     * @return 用户对象
     */
    User selectById(Long id);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户对象
     */
    User selectByUsername(String username);

    /**
     * 根据手机号查询用户
     *
     * @param phone 手机号
     * @return 用户对象
     */
    User selectByPhone(String phone);

    /**
     * 根据邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户对象
     */
    User selectByEmail(String email);

    /**
     * 统计用户总数
     *
     * @param username 用户名（可选）
     * @return 用户总数
     */
    long countAll(@Param("username") String username);

    /**
     * 分页查询用户
     *
     * @param username 用户名（可选）
     * @param offset   偏移量
     * @param limit    限制数量
     * @return 用户列表
     */
    List<User> selectByPage(@Param("username") String username, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 插入用户
     *
     * @param user 用户对象
     * @return 影响行数
     */
    int insert(User user);

    /**
     * 更新用户
     *
     * @param user 用户对象
     * @return 影响行数
     */
    int update(User user);

    /**
     * 更新用户密码
     *
     * @param id         用户ID
     * @param password   新密码
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int updatePassword(@Param("id") Long id, @Param("password") String password, @Param("updateTime") LocalDateTime updateTime);
}
